﻿using NetTopologySuite.Algorithm;
using NetTopologySuite.Geometries;
using Quartz.Impl.AdoJobStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Coldairarrow.Business.Interface
{
    public class Logistics
    {
        /// <summary>
        /// 错误状态码 
        /// </summary>
        public int code { get; set; }
        /// <summary>
        /// 请求对应的响应数据 
        /// </summary>
        public TK_data data { get; set; }
    }
    public class TK_data
    {
        /// <summary>
        /// 正常处理请求返回结果集合，如果没有满足条件的数据，返回集合为空。
        /// </summary>
        public List<accepted> accepted { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public List<rejected> rejected { get; set; }
    }
    public class accepted
    {
        /// <summary>
        /// 物流单号
        /// </summary>
        public string number { get; set; }
        /// <summary>
        /// 运输商代码
        /// </summary>
        public int carrier { get; set; }
        /// <summary>
        /// 物流单号附加参数，请参考【注册物流单号】
        /// </summary>
        public string param { get; set; }
        /// <summary>
        /// 自定义标签，最长 100 个字符。如：关联标识，备注分组等
        /// </summary>
        public string tag { get; set; }
        /// <summary>
        /// 物流信息主结构节点
        /// </summary>
        public track_info track_info { get; set; }
    }
    public class track_info
    {
        /// <summary>
        /// 地区相关信息节点
        /// </summary>
        public shipping_info shipping_info { get; set; }
        public latest_status latest_status { get; set; }
        /// <summary>
        /// 最新事件，信息结构与描述参考 events 集合
        /// </summary>
        public latest_event latest_event { get; set; }
        public time_metrics time_metrics { get; set; }
        /// <summary>
        /// 里程碑 作用：展示承运过程中的主要节点及发生顺序
        /// </summary>
        public List<milestone> milestone { get; set; }

        public misc_info misc_info { get; set; }
        public tracking tracking { get; set; }
    }
    public class shipping_info
    {
        /// <summary>
        /// 地区相关信息节点
        /// </summary>
        public shipper_address shipper_address { get; set; }
        public recipient_address recipient_address { get; set; }

    }
    public class shipper_address
    {
        /// <summary>
        /// 国家或地区（大写）
        /// </summary>
        public string country { get; set; }
        /// <summary>
        /// 州、省。
        /// </summary>
        public string state { get; set; }
        /// <summary>
        /// 邮编
        /// </summary>
        public string postal_code { get; set; }
        /// <summary>
        /// 城市
        /// </summary>
        public string city { get; set; }
        /// <summary>
        /// 街道
        /// </summary>
        public string street { get; set; }
        /// <summary>
        /// 位置坐标（如经度纬度）
        /// </summary>
        public coordinates coordinates { get; set; }

    }
    public class coordinates
    {
        /// <summary>
        /// 经度
        /// </summary>
        public string longitude { get; set; }
        /// <summary>
        /// 纬度
        /// </summary>
        public string latitude { get; set; }

    }

    public class recipient_address
    {
        /// <summary>
        /// 国家或地区（大写）
        /// </summary>
        public string country { get; set; }
        /// <summary>
        /// 州、省
        /// </summary>
        public string state { get; set; }
        /// <summary>
        /// 城市
        /// </summary>
        public string city { get; set; }
        /// <summary>
        /// 街道
        /// </summary>
        public string street { get; set; }
        /// <summary>
        /// 邮编
        /// </summary>
        public string postal_code { get; set; }
        /// <summary>
        /// 位置坐标（如经度纬度）
        /// </summary>
        public coordinates coordinates { get; set; }
    }

    public class latest_status
    {
        /// <summary>
        /// 物流主状态
        /// </summary>
        public string status { get; set; }
        /// <summary>
        /// 包裹子状态
        /// </summary>
        public string sub_status { get; set; }
        /// <summary>
        /// 状态描述
        /// </summary>
        public string sub_status_descr { get; set; }
    }

    public class latest_event
    {
        /// <summary>
        /// 
        /// </summary>
        public string time_iso { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string time_utc { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public time_raw time_raw { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string description { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string location { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string stage { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string sub_status { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public address address { get; set; }
    }

    public class time_raw
    {
        /// <summary>
        /// 年月日信息
        /// </summary>
        public string date { get; set; }
        /// <summary>
        /// 时分秒信息
        /// </summary>
        public string time { get; set; }
        /// <summary>
        /// 时区信息，如果 timezone 是 null，time_iso 是有效的时间则表示是由 17TRACK 补充的时区信息。
        /// </summary>
        public string timezone { get; set; }
    }
    public class address
    {
        /// <summary>
        /// 国家地区
        /// </summary>
        public string country { get; set; }
        /// <summary>
        /// 州、省
        /// </summary>
        public string state { get; set; }
        /// <summary>
        /// 城市
        /// </summary>
        public string city { get; set; }
        /// <summary>
        /// 街道
        /// </summary>
        public string street { get; set; }
        /// <summary>
        /// 邮编
        /// </summary>
        public string postal_code { get; set; }
        /// <summary>
        /// 位置坐标信息节点
        /// </summary>
        public coordinates coordinates { get; set; }
    }

    public class time_metrics
    {
        /// <summary>
        /// 运单时效：
        //签收状态时，间隔天数 = 签收时间 - 第 1 条事件时间
        //非签收状态且有结果时，间隔天数 = 当前时间 - 第 1 条事件时间
        //无结果时，间隔天数 = 0
        /// </summary>
        public string days_after_order { get; set; }
        /// <summary>
        /// 运输时效：
        //        签收状态时，间隔天数 = 签收时间 - 第 1 条事件时间
        //        非签收状态且有结果时，间隔天数 = 当前时间 - 开始运输的事件时间。
        //无结果时，间隔天数 = 0
        /// </summary>
        public string days_of_transit { get; set; }
        /// <summary>
        /// 妥投时效：
        //签收状态时，间隔天数 = 签收时间 - 第 1 条事件时间
        //非签收状态时，间隔天数 = 0
        /// </summary>
        public string days_of_transit_done { get; set; }
        /// <summary>
        /// 信息无更新天数：
        //        签收、退件签收、无结果时，间隔天数 = 0
        //其它情况时，间隔天数 = 当前时间 - 最后 1 条事件时间
        /// </summary>
        public string days_after_last_update { get; set; }
        /// <summary>
        /// 预期达到时间信息节点。
        /// </summary>
        public estimated_delivery_date estimated_delivery_date { get; set; }
    }
    public class estimated_delivery_date
    {
        /// <summary>
        /// 表示 from 和 to 的内容提供者，17TRACK 表示 17TRACK 提供，Official 表示由运输商官方提供，null 表示没有提供者
        /// </summary>
        public string source { get; set; }
        /// <summary>
        /// 预计投递最早时间（ISO 格式），例如：2021-09-01T08:00:54-05:00。
        /// </summary>
        public string from { get; set; }
        /// <summary>
        /// 预计投递最晚时间（ISO 格式），例如：2021-09-01T08:00:54-05:00。
        /// </summary>
        public string to { get; set; }
    }
    public class milestone
    {
        /// <summary>
        /// 里程碑，对应
        /// </summary>
        public string key_stage { get; set; }
        /// <summary>
        /// 1. 状态发生的时间（ISO 格式），由运输商当地时间转换得出带时区的格式，当时间格式错误则显示原始时间；
        //2. 上游运输商有时区信息则优先使用，没有按运输商总部所在的时区使用；
        //3. 例如：2022-03-02T20:43:24-06:00，表示当前为西6区；
        //4. 把（-06:00）时区信息去掉则为运输商当地时间；
        //5. 此值对应事件集合中的 time_iso，即：
        /// </summary>
        public string time_iso { get; set; }
        /// <summary>
        /// 1. 状态发生的时间（UTC 格式），由 time_iso 转换得来，time_iso 无效则显示为 null。
        //2. 例如：2022-03-03T02:43:24Z；
        //3. 此值对应事件集合中的 time_utc，
        /// </summary>
        public string time_utc { get; set; }
        /// <summary>
        /// 运输商提供的原始时间信息，
        //1. 共三组分别是：年月日、时分秒、时区。
        //2. 如果是 null，则表示运输商没有提供数据。
        /// </summary>
        public time_raw time_raw { get; set; }
    }

    /// <summary>
    /// 包裹附属信息节点
    /// </summary>
    public class misc_info
    {
        /// <summary>
        /// 包裹风险系数
        /// </summary>
        public string risk_factor { get; set; }
        /// <summary>
        ///服务类型 
        /// </summary>
        public string service_type { get; set; }
        /// <summary>
        /// 原始重量信息，返回的重量单位根据运输商提供，有可能是克、公斤、磅等
        /// </summary>
        public string weight_raw { get; set; }
        /// <summary>
        /// 把原始重量信息（ weight_raw） 转换为公斤
        /// </summary>
        public string weight_kg { get; set; }
        /// <summary>
        /// 件数
        /// </summary>
        public string pieces { get; set; }
        /// <summary>
        /// 原始体积尺寸(长宽高)，不同运输商可能会存在不同的类型，目前大多数运输商使用的是cm单位
        /// </summary>
        public string dimensions { get; set; }
        /// <summary>
        /// 收货客户单号
        /// </summary>
        public string customer_number { get; set; }
        /// <summary>
        /// 参考号
        /// </summary>
        public string reference_number { get; set; }
        /// <summary>
        /// 尾程单号
        /// </summary>
        public string local_number { get; set; }
        /// <summary>
        /// 尾程运输商
        /// </summary>
        public string local_provider { get; set; }
        /// <summary>
        /// 尾程运输商代码
        /// </summary>
        public string local_key { get; set; }
    }
    /// <summary>
    /// 物流信息节点
    /// </summary>
    public class tracking
    {
        /// <summary>
        /// 哈希值，根据事件内容计算出来，用于判断是否有变更。
        /// </summary>
        public string providers_hash { get; set; }
        /// <summary>
        /// 运输商集合节点
        //特别情况说明：当包裹是邮政承运时，providers[0] 对象表示目的地运输商信息，providers[1] 对象表示发件地运输商信息，有可能会出现 providers[0] 和 providers[1] 的轨迹描述、时间有重复的情况
        /// </summary>
        public List<providers> providers { get; set; }
    }

    /// <summary>
    /// 运输商集合节点
    //特别情况说明：当包裹是邮政承运时，providers[0] 对象表示目的地运输商信息，providers[1] 对象表示发件地运输商信息，有可能会出现 providers[0] 和 providers[1] 的轨迹描述、时间有重复的情况
    /// </summary>
    public class providers
    {
        /// <summary>
        /// 运输商信息节点
        /// </summary>
        public provider provider { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string provider_lang { get; set; }
        /// <summary>
        /// 服务类型
        /// </summary>
        public string service_type { get; set; }
        /// <summary>
        /// 最近同步状态，
        //Failure：同步失败；
        //Success：同步成功；
        /// </summary>
        public string latest_sync_status { get; set; }
        /// <summary>
        /// 最近同步时间
        /// </summary>
        public string latest_sync_time { get; set; }
        /// <summary>
        /// 事件哈希值
        /// </summary>
        public string events_hash { get; set; }
        /// <summary>
        /// 事件集合节点。每一项为物流事件对象，顺序是按事件时间倒序排列，离当前时间越近越靠前
        /// </summary>
        public List<events>  events { get; set; }
    }

    public class provider
    {
        /// <summary>
        /// 运输商代码
        /// </summary>
        public string key { get; set; }
        /// <summary>
        /// 运输商名称
        /// </summary>
        public string name { get; set; }
        /// <summary>
        /// 运输商别名
        /// </summary>
        public string alias { get; set; }
        /// <summary>
        /// 运输商联系电话
        /// </summary>
        public string tel { get; set; }
        /// <summary>
        /// 运输商官网
        /// </summary>
        public string homepage { get; set; }
        /// <summary>
        /// 运输商所属国家
        /// </summary>
        public string country { get; set; }
    }

    public class events
    {
        /// <summary>
        /// 1. 事件发生时间（ISO 格式），由运输商当地时间转换得出带时区的格式，当时间格式错误则显示原始时间；
        //2. 上游运输商有时区信息则优先使用，没有按运输商总部所在的时区使用；
        //3. 例如：2022-03-02T20:43:24-06:00，表示当前为西6区；
        //4. 把（-06:00）时区信息去掉则为运输商当地
        /// </summary>
        public string time_iso { get; set; }
        /// <summary>
        ///1. 事件发生时间（UTC 时间），由 time_iso 转换得来，time_iso 无效则显示为 null。
         //例如：2022-03-03T02:43:24Z；
        /// </summary>
        public string time_utc { get; set; }
        /// <summary>
        /// 运输商提供的原始时间信息，
        //1. 共三组分别是：年月日、时分秒、时区。
        //2. 如果是 null，则表示运输商没有提供数据。
        /// </summary>
        public time_raw time_raw { get; set; }
        /// <summary>
        /// 翻译后的事件描述。
        /// </summary>
        public string description { get; set; }
        /// <summary>
        /// 地点。
        /// </summary>
        public string location { get; set; }
        /// <summary>
        /// 里程碑状态，不保证一定会有状态信息，取决于上游运输商数据情况。
        /// </summary>
        public string stage { get; set; }
        /// <summary>
        /// 包裹子状态
        /// </summary>
        public string sub_status { get; set; }
        /// <summary>
        /// 地点信息节点
        /// </summary>
        public address address { get; set; }
    }


    /// <summary>
    /// 拒绝接受请求的单号信息集合。
    /// </summary>
    public class rejected
    {
        public string number { get; set; }
        public Error error { get; set; }
        public class Error
        {
            public string code { get; set; }
            public string message { get; set; }
        }

    }


}
